<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/2/18
 * Time: 5:19
 */
//-----------------定义常量
define('SYS_START_MEMORY', memory_get_usage());// 记录内存初始使用
define('SYS_START_TIME', microtime(true));//系统开始时间
define('WEKCMS', true);//入口标识
define('LINE', DIRECTORY_SEPARATOR);//文件目录层级链接符号
define('WEKCMS_PATH', ROOT_PATH . 'wekcms' . LINE);//wekcms框架路径
define('CACHE_PATH', ROOT_PATH . 'cache' . LINE);//缓存文件夹地址
//主机协议
define('SITE_PROTOCOL', isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://');
//当前访问的主机名
define('SITE_URL', (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''));
define('HTTP_REFERER', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');//来源
define('IS_POST', $_SERVER['REQUEST_METHOD'] == 'GET' ? false : true);//是否是POST请求
define('WEB_PATH', SITE_PROTOCOL . SITE_URL);//http://wekphp.cn/ 网站根绝对路径
define('IN_CLI', !empty($_SERVER['SHELL']) || empty($_SERVER['REMOTE_ADDR']));// 头部，判断是否运行在命令行下
define('RS', ROOT_PATH . 'resources');// 静态资源目录
const VERSION = '1.0';// 版本信息
!empty($_SERVER['HTTP_X_REWRITE_URL']) and $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
!isset($_SERVER['REQUEST_URI']) and $_SERVER['REQUEST_URI'] = '';
//头文件
header("Content-type: text/html; charset=utf-8");
header("X-Powered-By: WEKCMS 1.0");
//检测转移 /
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
    ini_set('magic_quotes_runtime', 0);
    define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc() ? true : false);
} else {
    define('MAGIC_QUOTES_GPC', false);
}
$_REQUEST = array_merge($_COOKIE, $_POST, $_GET);
$GLOBALS['session_start'] = false;
$GLOBALS['day'] = 86400;//一天的秒数 天数 * $GLOBALS['day'] 就是天数
!defined('DEBUG') and define('DEBUG', 1); // 1: 开发模式， 2: 线上调试：日志记录，0：线上: 关闭调试日志
/* 行错误及异常处理  */
error_reporting(E_ALL);
ini_set('display_errors', 'on');
/*错误的捕获*/
register_shutdown_function(function () {
    if (DEBUG) {
        $errors = error_get_last();
        if (!empty($errors)) {
            //获取最后发生的错误
            extract($errors);
            include WEKCMS_PATH . 'tmp/error.php';
            exit;
        }
    }
});

//-----------------加载公用函数库和配置
base::load_all_file(WEKCMS_PATH . 'functions');                                          //加载-所有-系统核心函数
base::load_all_file(ROOT_PATH . 'functions');          //加载-所有-用户自定义函数
base::load_all_config();                                        //加载-所有-配置项
initDb();
//路由
base::load_sys_class('Route', '', 0);   //加载路由功能组件
Route::init(array('root_path' => ROOT_PATH, 'route_type' => ROUTE_TYPE));                   //初始化路由组件
//加载-所有-路由规则
if (ROUTE_TYPE) {
    //加载所有pathinfo模式下的路由规则
    //未安装，安装程序
    if (!file_exists(ROOT_PATH . 'install.lock')) {
        header('Location: install/index.php');
        exit;
    }
    Route::auto_load_route(ROOT_PATH . 'route');
/*    Route::EditUrl(function (&$rule_url) {                        //修改请求路由事件 $rule_url 请求的路由规则
//    伪静态提取url参数
    dd($rule_url);//显示当前路由
    });*/
    //dd(Route::showAllRule());//显示所有路由
} else {

}

//注册404处理方式
Route::SetNotFound(function ($errInfo) {                        //404事件-自定义404处理
    msg_no($errInfo['title'], $errInfo['info']);
});
//-----------------设置
// 设置系统时区
function_exists('date_default_timezone_set') && date_default_timezone_set(app::get_config('sys', 'timezone', 'Asia/Shanghai'));
//压缩缓冲区内容输出
if (base::load_all_config('sys', 'gzip') && function_exists('ob_gzhandler')) {
    ob_start('ob_gzhandler');
} else {
    ob_start();
}

//容器池
class app
{
    public static $config = array();//配置
    public static $class = array();//加载的类对象
    //------------------class管理--------------
    //容器存放对象
    public static function set_class($name, $object)
    {
        self::$class[$name] = $object;
    }

    //从容器获取对象
    public static function get_class($name)
    {
        if (isset(self::$class[$name])) {
            return self::$class[$name];
        }
        return false;
    }

    //从容器注销对象
    public static function del_class($name)
    {
        unset(self::$class[$name]);
    }
    //------------------config管理--------------
    //容器存放配置
    public static function set_config($name, $value)
    {
        self::$config[$name] = $value;
    }

    //从容器获取配置
    public static function get_config($file, $key = '', $default = '')
    {
        if (empty($key)) {
            //查询所有配置
            return app::$config[$file];
        } elseif (!empty(app::$config[$file][$key])) {
            //查询指定配置
            return app::$config[$file][$key];
        } else {
            //没有返回默认值
            return $default;
        }
    }

    //从容器注销配置
    public static function del_config($file, $key = '')
    {
        if (empty($key)) {
            //查询所有配置
            unset(app::$config[$file]);
        } elseif (isset($configs[$file][$key])) {
            //查询指定配置
            unset(app::$config[$file][$key]);
        }
    }
}

class base
{
    public static function run()
    {
        Route::go();
    }

    /**
     * 加载函数库
     * @param string $func_name 函数文件名
     * @param string $path 地址
     */
    public static function load_sys_func($func_name, $path = '')
    {
        static $funcs = array();
        if (empty($path)) $path = 'functions';
        $path .= LINE . $func_name . '.func.php';
        $key = md5($path);
        if (isset($funcs[$key])) return true;
        if (!file_exists(WEKCMS_PATH . $path)) {
            msg_no('请检查文件名是否正确：' . WEKCMS_PATH . $path, '函数不存在');
        }
        include WEKCMS_PATH . $path;
        $funcs[$key] = true;
        return true;
    }

    /**
     * 自动加载函数库所有文件
     * @param string $func 函数库名
     * @param string $path 地址
     */
    public static function load_all_file($file_path, $suffix = '.func.php')
    {
        $file_path .= LINE . '*' . $suffix;
        $funcs_list = glob($file_path);
        if (!empty($funcs_list) && is_array($funcs_list)) {
            foreach ($funcs_list as $func_path) {
                include $func_path;
            }
        }
    }

    /**
     * 加载所有配置文件
     * @param string $file 配置文件
     * @param string $key 要获取的配置荐
     * @param string $default 默认配置。当获取配置项目失败时该值发生作用。
     * @param boolean $reload 强制重新加载。
     */
    public static function load_all_config()
    {
        $file_path = ROOT_PATH . 'configs' . LINE . '*.php';
        $config_list = glob($file_path);
        if (is_array($config_list)) {
            foreach ($config_list as $config) {
                app::set_config(pathinfo($config)['filename'], include $config);
            }
        }
    }

    /**
     * 加载系统类方法
     * @param string $classname 类名
     * @param string $path 扩展地址
     * @param intger $initialize 是否初始化
     */
    public static function load_sys_class($classname, $path = '', $initialize = 1)
    {
        return self::_load_class($classname, $path, $initialize);
    }

    /**
     * 加载系统类方法
     * @param string $classname 类名
     * @param string $path 扩展地址
     * @param intger $initialize 是否初始化
     */
    public static function load_app_class($classname, $path = '', $initialize = 1)
    {
        if ($path == '') {
            $path = ROUTE_M . LINE . 'classes';
        }
        return self::_load_class($classname, 'app' . LINE . 'modules' . LINE . $path, $initialize);
    }

    /**
     * 加载类文件函数
     * @param string $classname 类名
     * @param string $path 扩展地址
     * @param intger $initialize 是否初始化
     */
    private static function _load_class($classname, $path = '', $initialize = 1)
    {
        if (is_array($classname)) {
            $name = $classname[0];
            $classparam = $classname[1];
        } else {
            $name = $classname;
        }
        if (empty($path)) $path = 'wekcms' . LINE . 'classes';
        //防重复加载
        if (!empty(app::get_class($name))) {
            return app::get_class($name);
        }
        $class_path = ROOT_PATH . $path . LINE . $name . '.class.php';
        if (!file_exists($class_path)) {
            msg_no($class_path . '不存在');
        }
        if (include $class_path) {
            if ($initialize) {
                if (!isset($classparam)) $classparam = array();
                $object = new $name($classparam);
                app::set_class($name, $object);
            } else {
                app::set_class($name, true);
                $object = true;
            }
            return $object;//返回对象或者key
        }
    }
}